package cn.wolfcode.web.advice;

import cn.wolfcode.exception.LogicException;
import cn.wolfcode.qo.JsonResult;
import com.alibaba.fastjson.JSON;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@ControllerAdvice
public class ExceptionHandlerControllerAdvice {
//    定义处理异常的方法
    @ExceptionHandler(LogicException.class)
    public String handlerLogicException(){
        return null;
    }

//     该方法是用于捕获并处理某种异常
//      e：现在出现的异常对象
//     method：现在出现异常的那个处理方法
    @ExceptionHandler(RuntimeException.class)
    public String exceptionHandler(Model model,RuntimeException e, HandlerMethod method, HttpServletResponse response) {
        e.printStackTrace(); // 方便开发的时候找 bug
        // 若原本控制器的方法是返回 JSON，现在出异常也应该返回 JSON
        // 获取当前出现异常的方法，判断是否有 ResponseBody 注解，有就代表需要返回 JSON
        if(method.hasMethodAnnotation(ResponseBody.class)){
            try {
                response.setContentType("application/json;charset=UTF-8");
                response.getWriter()
                        .print(JSON.toJSONString(new JsonResult(false, "系统异常，请联系管理员")));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
                return null;
        }else {
        // 若原本控制器的方法是返回 HTML，现在也应该返回 HTML
            model.addAttribute("errorMsg","系统异常，请联系管理员");
        return "common/error";
        }
    }
}
